From 1c10d3120699fc458779b34b7c1ef98c1efc36e0 Mon Sep 17 00:00:00 2001 From: =?utf8?q?=C3=98yvind=20Kol=C3=A5s?= Date: Sun, 18 Sep 2005 21:02:22 +0000 Subject: [PATCH] register linear reference functions --- babl/base/model-cmyk.c | 103 ++++++++------------------- babl/base/model-gray.c | 149 +++++++++++++++++++++------------------- babl/base/model-rgb.c | 10 --- babl/base/model-ycbcr.c | 148 ++++++++++++++++++++++++--------------- extensions/CIE-Lab.c | 132 +++++++++++++++++++++-------------- extensions/naive-CMYK.c | 123 +++++++++++---------------------- 6 files changed, 321 insertions(+), 344 deletions(-) diff --git a/babl/base/model-cmyk.c b/babl/base/model-cmyk.c index 85df068..a4fbdc1 100644 --- a/babl/base/model-cmyk.c +++ b/babl/base/model-cmyk.c @@ -96,21 +96,15 @@ models (void) } static long -rgb_to_cmyk (int src_bands, - void **src, - int *src_pitch, - int dst_bands, - void **dst, - int *dst_pitch, +rgb_to_cmyk (void *src, + void *dst, long n) { - BABL_PLANAR_SANITY - while (n--) { - double red = *(double*)src[0]; - double green = *(double*)src[1]; - double blue = *(double*)src[2]; + double red = ((double*)src)[0]; + double green = ((double*)src)[1]; + double blue = ((double*)src)[2]; double cyan, magenta, yellow, key; @@ -140,36 +134,28 @@ rgb_to_cmyk (int src_bands, yellow = 0.0; } - *(double*)dst[0] = cyan; - *(double*)dst[1] = magenta; - *(double*)dst[2] = yellow; - *(double*)dst[3] = key; - - if (dst_bands > 4) /* alpha passthorugh */ - *(double*)dst[4] = (src_bands>3)?*(double*)src[3]:1.0; + ((double*)dst)[0] = cyan; + ((double*)dst)[1] = magenta; + ((double*)dst)[2] = yellow; + ((double*)dst)[3] = key; - BABL_PLANAR_STEP + src+=4*sizeof(double); + dst+=4*sizeof(double) } return n; } static long -cmyk_to_rgb (int src_bands, - void **src, - int *src_pitch, - int dst_bands, - void **dst, - int *dst_pitch, - long n) +cmyk_to_rgb (void *src, + void *dst, + long n) { - BABL_PLANAR_SANITY - while (n--) { - double cyan = *(double*)src[0]; - double yellow = *(double*)src[1]; - double magenta = *(double*)src[2]; - double key = *(double*)src[3]; + double cyan = ((double*)src)[0]; + double yellow = ((double*)src)[1]; + double magenta = ((double*)src)[2]; + double key = ((double*)src)[3]; double red, green, blue; @@ -188,67 +174,35 @@ cmyk_to_rgb (int src_bands, green = 1.0 - magenta; blue = 1.0 - yellow; - *(double*)dst[0] = red; - *(double*)dst[1] = green; - *(double*)dst[2] = blue; + ((double*)dst)[0] = red; + ((double*)dst)[1] = green; + ((double*)dst)[2] = blue; - if (dst_bands > 3) /* alpha passthorugh */ - *(double*)dst[3] = (src_bands>4)?*(double*)src[4]:1.0; + ((double*)dst)[3] = 1.0; - BABL_PLANAR_STEP + src+=4*sizeof(double); + dst+=4*sizeof(double) } return n; } -#if 0 -static long -rgb_to_and_from_cmy (int src_bands, - void **src, - int *src_pitch, - int dst_bands, - void **dst, - int *dst_pitch, - long n) -{ - BABL_PLANAR_SANITY - - while (n--) - { - int band; - for (band=0; band< 3; band++) - { - *(double*)dst[band] = 1.0F- (*(double*) src[band]); - } - for (;band3) - alpha = *(double *)src[3]; - else - alpha = 1.0; + red = ((double *)src)[0]; + green = ((double *)src)[1]; + blue = ((double *)src)[2]; + alpha = ((double *)src)[3]; luminance = red * RGB_LUMINANCE_RED + green * RGB_LUMINANCE_GREEN + blue * RGB_LUMINANCE_BLUE; - *(double*)dst[0] = luminance; - if (dst_bands==2) - *(double*)dst[1] = alpha; + ((double*)dst)[0] = luminance; + ((double*)dst)[1] = alpha; - BABL_PLANAR_STEP + src += sizeof (double) * 4; + dst += sizeof (double) * 2; + } + return n; +} + +static long +rgba_to_gray (void *src, + void *dst, + long n) +{ + while (n--) + { + double red, green, blue; + double luminance, alpha; + + red = ((double *)src)[0]; + green = ((double *)src)[1]; + blue = ((double *)src)[2]; + alpha = ((double *)src)[3]; + + luminance = red * RGB_LUMINANCE_RED + + green * RGB_LUMINANCE_GREEN + + blue * RGB_LUMINANCE_BLUE; + + ((double*)dst)[0] = luminance; + + src += sizeof (double) * 4; + dst += sizeof (double) * 1; } return n; } @@ -205,38 +224,56 @@ gray_2_2_to_rgb (int src_bands, static long -gray_to_rgb (int src_bands, - void **src, - int *src_pitch, - int dst_bands, - void **dst, - int *dst_pitch, - long n) +graya_to_rgba (void *src, + void *dst, + long n) { - BABL_PLANAR_SANITY while (n--) { double luminance; double red, green, blue; double alpha; - luminance = *(double *)src[0]; + luminance = ((double *)src)[0]; + alpha = ((double *)src)[1]; red = luminance; green = luminance; blue = luminance; - if (src_bands > 1) - alpha = *(double *)src[1]; - else - alpha = 1.0; - *(double*)dst[0] = red; - *(double*)dst[1] = green; - *(double*)dst[2] = blue; + ((double*)dst)[0] = red; + ((double*)dst)[1] = green; + ((double*)dst)[2] = blue; + ((double*)dst)[3] = alpha; - if (dst_bands>3) - *(double*)dst[3] = alpha; + src += sizeof(double)*2; + dst += sizeof(double)*4; + } + return n; +} - BABL_PLANAR_STEP + +static long +gray_to_rgba (void *src, + void *dst, + long n) +{ + while (n--) + { + double luminance; + double red, green, blue; + + luminance = ((double *)src)[0]; + red = luminance; + green = luminance; + blue = luminance; + + ((double*)dst)[0] = red; + ((double*)dst)[1] = green; + ((double*)dst)[2] = blue; + ((double*)dst)[3] = 1.0; + + src += sizeof(double)*1; + dst += sizeof(double)*4; } return n; } @@ -409,56 +446,28 @@ conversions (void) babl_conversion_new ( babl_model_id (BABL_GRAY), babl_model_id (BABL_RGBA), - "planar", gray_to_rgb, - NULL - ); - - babl_conversion_new ( - babl_model_id (BABL_GRAY), - babl_model_id (BABL_RGB), - "planar", gray_to_rgb, + "linear", gray_to_rgba, NULL ); babl_conversion_new ( babl_model_id (BABL_GRAY_ALPHA), babl_model_id (BABL_RGBA), - "planar", gray_to_rgb, - NULL - ); - - babl_conversion_new ( - babl_model_id (BABL_GRAY_ALPHA), - babl_model_id (BABL_RGB), - "planar", gray_to_rgb, + "linear", graya_to_rgba, NULL ); babl_conversion_new ( babl_model_id (BABL_RGBA), babl_model_id (BABL_GRAY_ALPHA), - "planar", rgb_to_gray, + "linear", rgba_to_graya, NULL ); babl_conversion_new ( babl_model_id (BABL_RGBA), babl_model_id (BABL_GRAY), - "planar", rgb_to_gray, - NULL - ); - - babl_conversion_new ( - babl_model_id (BABL_RGB), - babl_model_id (BABL_GRAY_ALPHA), - "planar", rgb_to_gray, - NULL - ); - - babl_conversion_new ( - babl_model_id (BABL_RGB), - babl_model_id (BABL_GRAY), - "planar", rgb_to_gray, + "linear", rgba_to_gray, NULL ); diff --git a/babl/base/model-rgb.c b/babl/base/model-rgb.c index 73ecfe9..e64a86f 100644 --- a/babl/base/model-rgb.c +++ b/babl/base/model-rgb.c @@ -368,16 +368,6 @@ formats (void) babl_component_id (BABL_ALPHA), NULL); - babl_format_new ( - "id", BABL_RGBA_DOUBLE, - babl_model_id (BABL_RGBA), - babl_type_id (BABL_DOUBLE), - babl_component_id (BABL_RED), - babl_component_id (BABL_GREEN), - babl_component_id (BABL_BLUE), - babl_component_id (BABL_ALPHA), - NULL); - babl_format_new ( "id", BABL_RGB_FLOAT, babl_model_id (BABL_RGB), diff --git a/babl/base/model-ycbcr.c b/babl/base/model-ycbcr.c index 6a3e2aa..000f32d 100644 --- a/babl/base/model-ycbcr.c +++ b/babl/base/model-ycbcr.c @@ -75,21 +75,16 @@ models (void) } static long -rgb_to_ycbcr (int src_bands, - void **src, - int *src_pitch, - int dst_bands, - void **dst, - int *dst_pitch, - long n) +rgba_to_ycbcra (void *src, + void *dst, + long n) { - BABL_PLANAR_SANITY - while (n--) { - double red = *(double*)src[0]; - double green = *(double*)src[1]; - double blue = *(double*)src[2]; + double red = ((double*)src)[0]; + double green = ((double*)src)[1]; + double blue = ((double*)src)[2]; + double alpha = ((double*)src)[3]; double luminance, cb, cr; @@ -101,34 +96,60 @@ rgb_to_ycbcr (int src_bands, cb = -0.168736 * red -0.331264 * green +0.5 * blue; cr = 0.5 * red -0.418688 * green -0.081312 * blue; - *(double*)dst[0] = luminance; - *(double*)dst[1] = cb; - *(double*)dst[2] = cr; - - if (dst_bands > 3) /* alpha passthorugh */ - *(double*)dst[3] = (src_bands>3)?*(double*)src[3]:1.0; + ((double*)dst)[0] = luminance; + ((double*)dst)[1] = cb; + ((double*)dst)[2] = cr; + ((double*)dst)[3] = alpha; - BABL_PLANAR_STEP + src += sizeof (double) * 4; + dst += sizeof (double) * 4; } return n; } + static long -ycbcr_to_rgb (int src_bands, - void **src, - int *src_pitch, - int dst_bands, - void **dst, - int *dst_pitch, - long n) +rgba_to_ycbcr (void *src, + void *dst, + long n) { - BABL_PLANAR_SANITY + while (n--) + { + double red = ((double*)src)[0]; + double green = ((double*)src)[1]; + double blue = ((double*)src)[2]; + + double luminance, cb, cr; + + red = linear_to_gamma_2_2 (red); + green = linear_to_gamma_2_2 (green); + blue = linear_to_gamma_2_2 (blue); + + luminance = 0.299 * red +0.587 * green +0.114 * blue; + cb = -0.168736 * red -0.331264 * green +0.5 * blue; + cr = 0.5 * red -0.418688 * green -0.081312 * blue; + + ((double*)dst)[0] = luminance; + ((double*)dst)[1] = cb; + ((double*)dst)[2] = cr; + + src += sizeof (double) * 4; + dst += sizeof (double) * 3; + } + return n; +} +static long +ycbcra_to_rgba (void *src, + void *dst, + long n) +{ while (n--) { - double luminance = *(double*)src[0]; - double cb = *(double*)src[1]; - double cr = *(double*)src[2]; + double luminance = ((double*)src)[0]; + double cb = ((double*)src)[1]; + double cr = ((double*)src)[2]; + double alpha = ((double*)src)[3]; double red, green, blue; @@ -140,14 +161,46 @@ ycbcr_to_rgb (int src_bands, green = gamma_2_2_to_linear (green); blue = gamma_2_2_to_linear (blue); - *(double*)dst[0] = red; - *(double*)dst[1] = green; - *(double*)dst[2] = blue; + ((double*)dst)[0] = red; + ((double*)dst)[1] = green; + ((double*)dst)[2] = blue; + ((double*)dst)[3] = alpha; + + src += sizeof (double) * 4; + dst += sizeof (double) * 4; + } + return n; +} - if (dst_bands > 3) /* alpha passthorugh */ - *(double*)dst[3] = (src_bands>3)?*(double*)src[3]:1.0; - BABL_PLANAR_STEP +static long +ycbcr_to_rgba (void *src, + void *dst, + long n) +{ + while (n--) + { + double luminance = ((double*)src)[0]; + double cb = ((double*)src)[1]; + double cr = ((double*)src)[2]; + + double red, green, blue; + + red = 1.0 * luminance + 0.0 * cb + 1.40200 * cr; + green = 1.0 * luminance - 0.344136 * cb - 0.71414136 * cr; + blue = 1.0 * luminance + 1.772 * cb + 0.0 * cr; + + red = gamma_2_2_to_linear (red); + green = gamma_2_2_to_linear (green); + blue = gamma_2_2_to_linear (blue); + + ((double*)dst)[0] = red; + ((double*)dst)[1] = green; + ((double*)dst)[2] = blue; + ((double*)dst)[3] = 1.0; + + src += sizeof (double) * 3; + dst += sizeof (double) * 4; } return n; } @@ -158,37 +211,25 @@ conversions (void) babl_conversion_new ( babl_model_id (BABL_RGBA), babl_model_id (BABL_YCBCR), - "planar", rgb_to_ycbcr, + "linear", rgba_to_ycbcr, NULL ); babl_conversion_new ( babl_model_id (BABL_YCBCR), babl_model_id (BABL_RGBA), - "planar", ycbcr_to_rgb, - NULL - ); - babl_conversion_new ( - babl_model_id (BABL_RGB), - babl_model_id (BABL_YCBCR), - "planar", rgb_to_ycbcr, - NULL - ); - babl_conversion_new ( - babl_model_id (BABL_YCBCR), - babl_model_id (BABL_RGB), - "planar", ycbcr_to_rgb, + "linear", ycbcr_to_rgba, NULL ); babl_conversion_new ( babl_model_id (BABL_RGBA), babl_model_id (BABL_YCBCR_ALPHA), - "planar", rgb_to_ycbcr, + "linear", rgba_to_ycbcra, NULL ); babl_conversion_new ( babl_model_id (BABL_YCBCR_ALPHA), babl_model_id (BABL_RGBA), - "planar", ycbcr_to_rgb, + "linear", ycbcra_to_rgba, NULL ); } @@ -196,9 +237,8 @@ conversions (void) static void formats (void) { - babl_format_new ( - "name", "Y'CbCr u8 4:4:4", + "name", "Y'CbCr u8", "id", BABL_YCBCR420, "planar", babl_model_id (BABL_YCBCR), diff --git a/extensions/CIE-Lab.c b/extensions/CIE-Lab.c index ae56721..6cbbefc 100644 --- a/extensions/CIE-Lab.c +++ b/extensions/CIE-Lab.c @@ -143,67 +143,107 @@ cpercep_distance_space (const double L1, const double a1, const double b1, static long -rgb_to_lab (int src_bands, - void **src, - int *src_pitch, - int dst_bands, - void **dst, - int *dst_pitch, - long n) +rgba_to_lab (void *src, + void *dst, + long n) { - BABL_PLANAR_SANITY - while (n--) { - double red = *(double*)src[0]; - double green = *(double*)src[1]; - double blue = *(double*)src[2]; + double red = ((double*)src)[0]; + double green = ((double*)src)[1]; + double blue = ((double*)src)[2]; double L, a, b; cpercep_rgb_to_space (red, green, blue, &L, &a, &b); - *(double*)dst[0] = L; - *(double*)dst[1] = a; - *(double*)dst[2] = b; + ((double*)dst)[0] = L; + ((double*)dst)[1] = a; + ((double*)dst)[2] = b; + + src += sizeof(double) * 4; + dst += sizeof(double) * 3; + } + return n; +} - if (dst_bands > 3) /* alpha passthorugh */ - *(double*)dst[3] = (src_bands>3)?*(double*)src[3]:1.0; +static long +lab_to_rgba (void *src, + void *dst, + long n) +{ + while (n--) + { + double L = ((double*)src)[0]; + double a = ((double*)src)[1]; + double b = ((double*)src)[2]; - BABL_PLANAR_STEP + double red, green, blue; + + cpercep_space_to_rgb (L, a, b, &red, &green, &blue); + + ((double*)dst)[0] = red; + ((double*)dst)[1] = green; + ((double*)dst)[2] = blue; + ((double*)dst)[3] = 1.0; + + src += sizeof(double) * 3; + dst += sizeof(double) * 4; } return n; } + static long -lab_to_rgb (int src_bands, - void **src, - int *src_pitch, - int dst_bands, - void **dst, - int *dst_pitch, - long n) +rgba_to_laba (void *src, + void *dst, + long n) { - BABL_PLANAR_SANITY + while (n--) + { + double red = ((double*)src)[0]; + double green = ((double*)src)[1]; + double blue = ((double*)src)[2]; + double alpha = ((double*)src)[3]; + + double L, a, b; + cpercep_rgb_to_space (red, green, blue, &L, &a, &b); + + ((double*)dst)[0] = L; + ((double*)dst)[1] = a; + ((double*)dst)[2] = b; + ((double*)dst)[3] = alpha; + + src += sizeof(double) * 4; + dst += sizeof(double) * 4; + } + return n; +} + +static long +laba_to_rgba (void *src, + void *dst, + long n) +{ while (n--) { - double L = *(double*)src[0]; - double a = *(double*)src[1]; - double b = *(double*)src[2]; + double L = ((double*)src)[0]; + double a = ((double*)src)[1]; + double b = ((double*)src)[2]; + double alpha = ((double*)src)[3]; double red, green, blue; cpercep_space_to_rgb (L, a, b, &red, &green, &blue); - *(double*)dst[0] = red; - *(double*)dst[1] = green; - *(double*)dst[2] = blue; + ((double*)dst)[0] = red; + ((double*)dst)[1] = green; + ((double*)dst)[2] = blue; + ((double*)dst)[3] = alpha; - if (dst_bands > 3) /* alpha passthorugh */ - *(double*)dst[3] = (src_bands>3)?*(double*)src[3]:1.0; - - BABL_PLANAR_STEP + src += sizeof(double) * 4; + dst += sizeof(double) * 4; } return n; } @@ -215,37 +255,25 @@ conversions (void) babl_conversion_new ( babl_model ("RGBA"), babl_model ("CIE Lab"), - "planar", rgb_to_lab, + "linear", rgba_to_lab, NULL ); babl_conversion_new ( babl_model ("CIE Lab"), babl_model ("RGBA"), - "planar", lab_to_rgb, - NULL - ); - babl_conversion_new ( - babl_model ("RGB"), - babl_model ("CIE Lab"), - "planar", rgb_to_lab, - NULL - ); - babl_conversion_new ( - babl_model ("CIE Lab"), - babl_model ("RGB"), - "planar", lab_to_rgb, + "linear", lab_to_rgba, NULL ); babl_conversion_new ( babl_model ("RGBA"), babl_model ("CIE Lab alpha"), - "planar", rgb_to_lab, + "linear", rgba_to_laba, NULL ); babl_conversion_new ( babl_model ("CIE Lab alpha"), babl_model ("RGBA"), - "planar", lab_to_rgb, + "linear", laba_to_rgba, NULL ); diff --git a/extensions/naive-CMYK.c b/extensions/naive-CMYK.c index 7badb0d..0b5478b 100644 --- a/extensions/naive-CMYK.c +++ b/extensions/naive-CMYK.c @@ -23,20 +23,16 @@ #include "babl.h" #include "util.h" -static long rgb_to_cmyk (int src_bands, - void **src, - int *src_pitch, - int dst_bands, - void **dst, - int *dst_pitch, - long n); -static long cmyk_to_rgb (int src_bands, - void **src, - int *src_pitch, - int dst_bands, - void **dst, - int *dst_pitch, - long n); +static long +rgba_to_cmyk (void *src, + void *dst, + long n); + +static long +cmyk_to_rgba (void *src, + void *dst, + long n); + int init (void) { @@ -55,45 +51,19 @@ init (void) NULL ); - babl_model_new ( - "name", "CMYKA", - babl_component ("cyan"), - babl_component ("magenta"), - babl_component ("yellow"), - babl_component ("key"), - babl_component ("A"), - NULL - ); - babl_conversion_new ( babl_model ("RGBA"), babl_model ("CMYK"), - "planar", rgb_to_cmyk, + "linear", rgba_to_cmyk, NULL ); babl_conversion_new ( babl_model ("CMYK"), babl_model ("RGBA"), - "planar", cmyk_to_rgb, - NULL - ); - - - babl_conversion_new ( - babl_model ("RGBA"), - babl_model ("CMYKA"), - "planar", rgb_to_cmyk, - NULL - ); - - babl_conversion_new ( - babl_model ("CMYKA"), - babl_model ("RGBA"), - "planar", cmyk_to_rgb, + "linear", cmyk_to_rgba, NULL ); - babl_format_new ( "name", "CMYK float", babl_model ("CMYK"), @@ -108,26 +78,21 @@ init (void) return 0; } + static long -rgb_to_cmyk (int src_bands, - void **src, - int *src_pitch, - int dst_bands, - void **dst, - int *dst_pitch, - long n) +rgba_to_cmyk (void *src, + void *dst, + long n) { - BABL_PLANAR_SANITY - while (n--) { - double red = *(double*)src[0]; - double green = *(double*)src[1]; - double blue = *(double*)src[2]; + double red = ((double*)src)[0]; + double green = ((double*)src)[1]; + double blue = ((double*)src)[2]; double cyan, magenta, yellow, key; - double pullout = 0.8; + double pullout = 1.0; cyan = 1.0 - red; magenta = 1.0 - green; @@ -153,36 +118,28 @@ rgb_to_cmyk (int src_bands, yellow = 0.0; } - *(double*)dst[0] = cyan; - *(double*)dst[1] = magenta; - *(double*)dst[2] = yellow; - *(double*)dst[3] = key; + ((double*)dst)[0] = cyan; + ((double*)dst)[1] = magenta; + ((double*)dst)[2] = yellow; + ((double*)dst)[3] = key; - if (dst_bands > 4) /* alpha passthorugh */ - *(double*)dst[4] = (src_bands>3)?*(double*)src[3]:1.0; - - BABL_PLANAR_STEP + src+=4*sizeof(double); + dst+=4*sizeof(double); } return n; } -static long -cmyk_to_rgb (int src_bands, - void **src, - int *src_pitch, - int dst_bands, - void **dst, - int *dst_pitch, - long n) +static long +cmyk_to_rgba (void *src, + void *dst, + long n) { - BABL_PLANAR_SANITY - while (n--) { - double cyan = *(double*)src[0]; - double magenta = *(double*)src[1]; - double yellow = *(double*)src[2]; - double key = *(double*)src[3]; + double cyan = ((double*)src)[0]; + double magenta = ((double*)src)[1]; + double yellow = ((double*)src)[2]; + double key = ((double*)src)[3]; double red, green, blue; @@ -201,14 +158,14 @@ cmyk_to_rgb (int src_bands, green = 1.0 - magenta; blue = 1.0 - yellow; - *(double*)dst[0] = red; - *(double*)dst[1] = green; - *(double*)dst[2] = blue; + ((double*)dst)[0] = red; + ((double*)dst)[1] = green; + ((double*)dst)[2] = blue; - if (dst_bands > 3) /* alpha passthorugh */ - *(double*)dst[3] = (src_bands>4)?*(double*)src[4]:1.0; + ((double*)dst)[3] = 1.0; - BABL_PLANAR_STEP + src+=4*sizeof(double); + dst+=4*sizeof(double); } return n; } -- 2.30.2